#!/usr/bin/env python
# -*-coding: utf-8 -*-
# Filename: buscar_intervenciones.py

##
# Módulos del sistema
try:
    import pygtk
    pygtk.require("2.0")
    import gtk
    import gtk.glade
except ImportError, error:
    print error
    print "Necesitas la librería gráficas gtk+pygtk"
from datetime import datetime

##
# Mósulos propios
try:
    from gui.msj_retroalimentacion import MensajeDeAdvertencia, MensajeDeError
    from lib.database import Intervencion, Ticket, Empleado
    from lib.funciones_utiles import add_find_column, close
    from gui.editar_estado_intervencion import EditarEstadoIntervencion
    from gui.agregar_comentarios_intervencion import AgregarComentariosIntervencion
except ImportError, error:
    print error
    print "Error en buscar_intervencines"
class BuscarIntervenciones:
    def __init__(self, padre):
        self.gladefile = "gui/ghhp.glade"
        self.wTree = gtk.glade.XML(self.gladefile, "BuscarIntervenciones")
        self.window = self.wTree.get_widget("BuscarIntervenciones")
        self.un_dict = {"on_button68_clicked" : self.buscar_intervenciones,
                "on_button69_clicked": self.limpiar_campos,
                "on_button70_clicked": self.close,
                "on_button74_clicked": self.close,
                "on_button73_clicked": self.aceptar,
                "on_button72_clicked": self.agregar_observaciones,
                "on_button71_clicked": self.editar_estado}
        self.wTree.signal_autoconnect(self.un_dict)
        self.padre = padre
        self.hbox_120 = self.wTree.get_widget("hbox120")
        self.hbox_121 = self.wTree.get_widget("hbox121")
        self.window.resize(250, 150)
        #Variables de instancia
        #Spin button
        self.fecha_desde_dia = self.wTree.get_widget("spinbutton5")
        self.fecha_desde_mes = self.wTree.get_widget("spinbutton9")
        self.fecha_desde_anio = self.wTree.get_widget("spinbutton7")
        self.fecha_hasta_dia = self.wTree.get_widget("spinbutton8")
        self.fecha_hasta_mes = self.wTree.get_widget("spinbutton10")
        self.fecha_hasta_anio = self.wTree.get_widget("spinbutton6")
        self.fecha_actual_spin_button()
        #entry
        self.entry_ticket = self.wTree.get_widget("entry87")
        self.entry_legajo = self.wTree.get_widget("entry88")
        self.combo_estado = self.wTree.get_widget("combobox9")
        self.combo_estado.set_model(gtk.ListStore(str))
        self.armar_combo()
        self.tree_resultado = self.wTree.get_widget("treeview17")
        self.lista_resultado = gtk.ListStore(str, str, str, str,str, str, str,
                str, str)
        self.tree_resultado.set_model(self.lista_resultado)
        self.armar_lista_resultado()
        self.lista_intervenciones = []
        self.ticket = None
        self.empleado = None

    def fecha_actual_spin_button(self):
        fecha_actual = datetime.now()
        self.fecha_hasta_dia.set_value(float(fecha_actual.day))
        self.fecha_hasta_mes.set_value(float(fecha_actual.month))
        self.fecha_hasta_anio.set_value(float(fecha_actual.year))

    def armar_lista_resultado(self):
        """Obtiene el tree view y arma las cabeceras de las columnas"""
        lista = ["Ticket", "Legajo", "Clasificacion\nactual", "Estado",
                "Fecha apertura", "Estado intervencion",
                "Fecha de\n asignacion", "Grupo actual",
                "Observaciones"]
        for pos, titulo in enumerate(lista):
            add_find_column(titulo, pos, self.tree_resultado)

    def armar_combo(self):
        #FIXME: ¿Cuáles son los estados, no lo tengo archivado?
        estados = ["Actual por defecto", "Activa", "En espera", "Todos"]
        for estado in estados:
            self.combo_estado.append_text(estado)
        self.combo_estado.set_active(0)

    def armar_fechas(self):
        """Toma los datos de los spin button y arma las fechas"""
        #Armamos las fechas
        self.fecha_desde = datetime(self.fecha_desde_anio.get_value_as_int(),
                self.fecha_desde_mes.get_value_as_int(),
                self.fecha_desde_dia.get_value_as_int())
        self.fecha_hasta = datetime(self.fecha_hasta_anio.get_value_as_int(),
                self.fecha_hasta_mes.get_value_as_int(),
                self.fecha_hasta_dia.get_value_as_int())

    def buscar_intervenciones(self, widget):
        """Busca las intervenciones desde la BD"""
        self.armar_fechas()
        if self.sin_criterios():
            print "Hacemos un gran select"
            intervenciones = Intervencion.select()
            # Si no existe una intervencion en la BD muestro el error
            try:
                intervenciones[0]
                self.mostrar_resultado(intervenciones)
            except IndexError, error:
                error = "No existen intervenciones con estos criterios"
                msj = MensajeDeError(error, self.window)
                msj.run()
        else:
            lista_widget = [self.entry_ticket.get_text(),
                    self.entry_legajo.get_text()]
            # Caso que tengamos el numero de legajo y el nro de ticket
            if lista_widget[0] and lista_widget[1]:
                self.obtener_ticket(lista_widget[0])
                self.obtener_empleado(lista_widget[1])
                self.armar_resultado()
            elif lista_widget[0]:
                self.obtener_ticket(lista_widget[0])
                self.armar_resultado()
            elif lista_widget[1]:
                self.obtener_empleado(lista_widget[1])
                self.armar_resultado()

    def obtener_ticket(self, numero):
        try:
            self.ticket = Ticket.selectBy(id=int(numero))[0]
        except IndexError, error:
            texto = "No existe ticket con ese numero"
            msj = MensajeDeError(texto, self.window)
            msj.run()
            self.entry_ticket.set_text('')
    
    def obtener_empleado(self, legajo):
        try:
            self.empleado = Empleado.selectBy(legajo=int(legajo))[0]
        except IndexError, error:
            texto = "No existe el legajo en el sitema personal."
            msj = MensajeDeError(texto, self.window)
            msj.run()
            self.entry_legajo.set_text('')

    def armar_resultado(self):
        # Si tengo solo legajo el resultado es self.empleado.tickets
        if self.ticket and self.empleado:
            #Busco las intervenciones de este emplado con ese numero
            print "Busco las intervenciones de este emplado con ese numero"
            intervenciones = []
            index = self.empleado.tickets_reclamados.index(self.ticket)
            ticket = self.empleado.tickets_reclamados[index]
            # Si las fechas son iguales buscamos las intervenciones de
            # ese dia
            if (self.fecha_desde == self.fecha_hasta):
                for intervencion in ticket.intervenciones:
                    if intervencion.fecha == self.fecha_desde:
                        intervenciones.append(intervencion)
                self.mostrar_resultado(intervenciones)
            else:
                # Buscamos por el rango de fechas
                for intervencion in ticket.intervenciones:
                    if (intervencion.fecha >= self.fecha_desde and
                            intervencion.fecha <= self.fecha_hasta):
                        intervenciones.append(intervencion)
                    print intervenciones
                self.mostrar_resultado(intervenciones)
        elif self.ticket:
            # Tenemos solo el ticket: devolvemos todas las
            # intervenciones asociadas al ticket
            print "Tenemos solo el ticket: devolvemos todas las ..."
            intervenciones = []
            if (self.fecha_desde == self.fecha_hasta):
                for intervencion in self.ticket.intervenciones:
                    if (intervencion.fecha.date() ==
                            self.fecha_desde.date()):
                        intervenciones.append(intervencion)
                self.mostrar_resultado(intervenciones)
            else:
                # Buscamos por el rango de fechas
                print "Buscamos por el rango de fechas"
                for intervencion in self.ticket.intervenciones:
                    if (intervencion.fecha >= self.fecha_desde and
                            intervencion.fecha <= self.fecha_hasta):
                        intervenciones.append(intervencion)
                    print intervenciones
                self.mostrar_resultado(intervenciones)
        elif self.empleado:
            #Buscamos todas las intervenciones del empleado
            print "Tenemos solo el empleado..."
            intervenciones = []
            if (self.fecha_desde == self.fecha_hasta):
                for ticket in self.empleado.tickets_reclamados:
                    for intervencion in ticket.intervenciones:
                        if intervencion.fecha == self.fecha_desde:
                            intervenciones.append(intervencion)
                self.mostrar_resultado(intervenciones)
            else:
                # Buscamos por el rango de fechas
                for ticket in self.empleado.tickets_reclamados:
                    for intervencion in ticket.intervenciones:
                        if (intervencion.fecha >= self.fecha_desde and
                                intervencion.fecha <= self.fecha_hasta):
                            intervenciones.append(intervencion)
                    print intervenciones
                self.mostrar_resultado(intervenciones)

    def mostrar_resultado(self, intervenciones):
        """Arma la lista_resultado"""
        for intervencion in intervenciones:
            lista = [intervencion.ticket.id,
                    intervencion.ticket.empleado.legajo,
                    intervencion.ticket.historial_de_clasificacion[-1].clasificacion.nombre,
                    intervencion.ticket.historial_de_estado[-1].estado.nombre,
                    intervencion.ticket.fecha_creacion.strftime("%d-%m-%Y"),
                    str(intervencion.estado),
                    intervencion.fecha.strftime("%d-%m-%Y"),
                    intervencion.grupo_de_resolucion.nombre,
                    intervencion.observaciones[-1].descripcion]
            self.lista_resultado.append(lista)
            self.lista_intervenciones.append(intervencion)
        self.hbox_121.show()
        self.hbox_120.hide()
        self.window.resize(800, 600)

    def sin_criterios(self):
        """Pregunta uno a uno de los widget de entrada si tienen datos.
        Retorna True si al menos uno tiene"""
        if (self.entry_ticket.get_text() or
                self.entry_legajo.get_text()):
            return False
        else:
            return True

    def limpiar_campos(self, widget):
        lista_entry = [self.entry_ticket, self.entry_legajo]

        for entry in lista_entry:
            entry.set_text('')
        self.combo_estado.set_active(0)
        self.cleane_spin()

    def cleane_spin(self):
        """Pone los spin button en sus valores de default."""
        lista_spin_1 = [self.fecha_desde_dia, self.fecha_desde_mes,
                self.fecha_hasta_dia, self.fecha_hasta_mes]
        lista_spin_1999 = [self.fecha_desde_anio, self.fecha_hasta_anio]
        for spin in lista_spin_1:
            spin.set_value(1)
        for spin in lista_spin_1999:
            spin.set_value(1999)


    def aceptar(self, widget):
        self.hbox_120.show()
        self.hbox_121.hide()
        self.window.resize(250, 150)
        self.lista_resultado.clear()
        self.limpiar_campos(None)

    def agregar_observaciones(self, widget):
        model, path = self.tree_resultado.get_selection().get_selected_rows()
        if path:
            pos, = path[0]
            self.agregar_comentarios = AgregarComentariosIntervencion(self,
                    self.lista_intervenciones[pos])
        else:
            error = "Para Agregar un comentario debe seleccionar la intervencion"
            msj = MensajeDeError(error, self.window)
            msj.run()

    def editar_estado(self, widget):
        model, path = self.tree_resultado.get_selection().get_selected_rows()
        if path:
            pos, = path[0]
            """
            # Verificacion especificada en el caso de uso.
            print self.lista_intervenciones[pos]
            if (self.lista_intervenciones[pos].grupo_de_resolucion.nombre ==
                    self.padre.grupo_de_resolucion.grupo.nombre):
                print "Puedo modificar el estado"
            else:
                print "No puedo"
                errores = ["La intervencion no esta asignada a este grupo.",
                        "No se puede cambiar el estado."]
                msj = MensajeDeError("\n".join(errores), self.window)
                msj.run()
                """
            self.editar_estado = EditarEstadoIntervencion(self,
                    self.lista_intervenciones[pos])
        else:
             error = "Para editar el estado debe seleccionar la intervencion"
             msj = MensajeDeError(error, self.window)
             msj.run()

    def close(self, widget):
        """Cancelación de la operación."""
        close(self.window)
